// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/PlayerStart.h"
#include "GameplayTagContainer.h"

#include "LyraPlayerStart.generated.h"

#define UE_API LYRAGAME_API

class AController;
class UObject;

enum class ELyraPlayerStartLocationOccupancy
{
	Empty, // 空
	Partial, // 部分占用
	Full // 满
};

/**
 * ALyraPlayerStart
 * 
 * 可以被许多模式使用的基础玩家出生点。
 */
UCLASS(MinimalAPI, Config = Game)
class ALyraPlayerStart : public APlayerStart
{
	GENERATED_BODY()

public:
	UE_API ALyraPlayerStart(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

	const FGameplayTagContainer& GetGameplayTags() { return StartPointTags; } // 获取游戏标签

	UE_API ELyraPlayerStartLocationOccupancy GetLocationOccupancy(AController* const ControllerPawnToFit) const; // 获取位置占用状态

	/** 这个玩家出生点是否已经被控制器声明？ */
	UE_API bool IsClaimed() const;

	/** 如果这个PlayerStart未被声明，为ClaimingController声明它 */
	UE_API bool TryClaim(AController* OccupyingController);

protected:
	/** 检查这个PlayerStart是否仍然被声明 */
	UE_API void CheckUnclaimed(); // 检查未声明

	/** 声明这个PlayerStart的控制器 */
	UPROPERTY(Transient) // 临时属性，不保存
	TObjectPtr<AController> ClaimingController = nullptr; // 声明控制器

	/** 检查这个玩家出生点是否不再与任何人碰撞的间隔 */
	UPROPERTY(EditDefaultsOnly, Category = "Player Start Claiming")
	float ExpirationCheckInterval = 1.f; // 过期检查间隔

	/** 用于标识这个玩家出生点的标签 */
	UPROPERTY(EditAnywhere)
	FGameplayTagContainer StartPointTags; // 出生点标签

	/** 用于跟踪过期重复计时器的句柄 */
	FTimerHandle ExpirationTimerHandle; // 过期计时器句柄
};

#undef UE_API